#include <vector>
#include <mutex>
#include <gtest/gtest.h>

template<typename T>
class NeedInt {
public:
    int reminder = T{} % 3;
};

template<class T>
class NeedSize {
public:
    int reminder = T{}.size() % 3;
};

int main()
{
    std::vector("");

    NeedInt<int> needInt1;
    NeedInt<double> needInt2;

    std::vector<int> iv;
    iv.push_back("");

    NeedSize<std::vector<int>> needSize1;
    NeedSize<int> needSize2;

    std::mutex mutex;
    std::lock_guard lock(mutex);
    std::lock_guard lock2(1);
    return 0;
}

#define MACRO1(x) MACRO2(x)
#define MACRO2(x) MACRO3(x)
#define MACRO3(x) MACRO4(x)
#define MACRO4(x) if (x) return;

TEST(test1, func)
{
    std::vector<int> iv;
    GTEST_ASSERT_EQ(iv.size(), 0);

    int zero = 0;
    MACRO1(iv.size() == zero);
    MACRO1(iv.size() == 0);

    MACRO1(NULL == nullptr);
    MACRO1(0 == nullptr);
    MACRO1(1 == nullptr);
}
